package com.JingYan.HuaWei;

import java.util.TreeSet;

/**
 * @program: JingYan
 * @ClassName: JKC004.java
 * @author: Dong
 * @version: 1.0.0
 * @Description: 华为机考C卷 公司开会
 * @createTime 2024年04月14日 21:50:00
 */
public class JKC004 {
    /**
     * 疫情期间，需要大家保证一定的社交距离。公司组织开交流会议，座位有一排共N个座位，编号分别为[0..N-1]。要求员工一个接着一个进入会议室，并且可以在任何时候离开会议室。
     * 满足以下条件：
     * 每当一个员工进入时，需要坐到最大社交距离的座位。例如：位置A与左右有员工落座的位置距离分别为2和2，位置B与左右有员工落座的位置距离分别为2和3，影响因素都为2个位置，则认为座位A和B与左右位置的社交距离是一样的。
     * 如果有多个这样的座位，则坐到索引最小的那个座位。
     */

    private TreeSet<Integer> occupiedSeats;
    private int size;

    public JKC004(int n) {
        occupiedSeats = new TreeSet<>();
        size = n;
    }

    public int seat() {
        // 如果所有座位都是空的，就坐在0号位
        if (occupiedSeats.isEmpty()) {
            occupiedSeats.add(0);
            return 0;
        }

        // 最大距离和最佳座位的初始化
        int maxDistance = 0;
        int bestSeat = 0;

        // 检查第一个座位
        Integer prev = null;
        for (Integer curr : occupiedSeats) {
            if (prev != null) {
                // 计算中间的距离
                int distance = (curr - prev) / 2;
                if (distance > maxDistance) {
                    maxDistance = distance;
                    bestSeat = prev + distance;
                }
            } else {
                // 检查第一个座位和0号位之间的距离
                if (curr > maxDistance) {
                    maxDistance = curr;
                    bestSeat = 0;
                }
            }
            prev = curr;
        }

        // 检查最后一个座位
        if (size - 1 - occupiedSeats.last() > maxDistance) {
            bestSeat = size - 1;
        }

        // 添加新占用的座位
        occupiedSeats.add(bestSeat);
        return bestSeat;
    }

    public void leave(int seatIndex) {
        occupiedSeats.remove(seatIndex);
    }

    public static void main(String[] args) {
        JKC004 meetingRoom = new JKC004(10); // 假设有10个座位
        System.out.println(meetingRoom.seat()); // 输出应该是0
        System.out.println(meetingRoom.seat()); // 输出应该是9
        meetingRoom.leave(0); // 第一个员工离开
        System.out.println(meetingRoom.seat());
        System.out.println(meetingRoom.seat());
        System.out.println(meetingRoom.seat());
        System.out.println(meetingRoom.seat());
        // ...可以继续添加更多的测试用例
    }
}
